import sys
import os
import pandas as pd
from download_raw_data import get_data


assumption = {
    'ratio_1': ['2013年以后商品房竣工单价是建筑竣工单价的倍数', 1.92]
}


def cum_df_to_yearly_df(df):
    """
    累计值转变为年度值
    """
    df['month'] = [i.month for i in df.index]
    df = df[df['month'] == 12]
    del df['month']
    return df


def cal_house_complete_value(q_data, keep_year=True):
    cols = ['住宅竣工房屋价值', '办公用房竣工房屋价值', '商业及服务用房竣工房屋价值']
    df = q_data.loc[:,cols]
    idx = pd.to_datetime(df.index)
    df['month'] = [i.month for i in idx]
    if keep_year:
        df = df[df['month'] == 12]
    return df


def cal_house_for_sale_complete_value_before_2013():
    """
    计算2013年之前的商品房竣工价值
    """
    df = pd.read_excel(r'.\投资数据源\商品房竣工价值.xlsx', index_col=1)
    # 数据特点，删除前8列元素
    df = df.iloc[:,8:].T
    # 选取12月的累计值数据当作年度值
    df.index = pd.to_datetime(df.index)
    df['month'] = [i.month for i in df.index]
    df = df[df['month'] == 12]
    del df['month']
    # 对三列求和，商品房竣工价值 = 住宅 + 商业营业用房 + 办公楼
    df['商品房竣工价值'] = df.sum(axis=1)
    return df['商品房竣工价值']


def cal_house_comp_area():
    m_data = get_data(freq='M',use_cache=True, sub_dir=False)
    # 步骤一、计算商品房销售单价
    y_data = cum_df_to_yearly_df(m_data)
    # 房屋竣工面积
    se = y_data['房屋竣工面积']
    se.name = '房屋竣工面积(单位万平米)'
    return se
    

def cal_house_comp_price_per_unit_before_2013(value_se, area_se):
    """
    计算房屋竣工价值单价
    """
    value_se.index = pd.to_datetime(value_se.index)
    area_se.index = pd.to_datetime(area_se.index)
    
    share_idx = [s for s in value_se.index if s in area_se.index]
    se = value_se[share_idx] / area_se[share_idx]
    se = se * 10000
    print('单位元/平米')
    return se


def cal_ark_comp_price_per_unit():
    """
    计算房建筑业竣工单价
    """
    q_data = get_data(freq='Q',use_cache=True, sub_dir=False)
    # 季度累计数据变年度数据
    y_data = cum_df_to_yearly_df(q_data)
    y_data = y_data.dropna(axis=0, how='all')
    
    value_cols = ['住宅竣工房屋价值', '办公用房竣工房屋价值', '商业及服务用房竣工房屋价值']
    area_cols = ['商业及服务用房竣工面积', '办公用房竣工面积', '住宅竣工面积']
    value_df = y_data.loc[:,value_cols].sum(axis=1)
    area_df = y_data.loc[:,area_cols].sum(axis=1)
    se = value_df / area_df
    se = se * 10000
    se.name = '建筑业竣工单价(单位万平米)'
    return se


def cal_house_comp_price_per_unit():
    # 3.1 2012年之前用 2013年之前的商品房竣工价值
    house_comp_value_before_2013 = cal_house_for_sale_complete_value_before_2013()
    # 3.2 2013年之后用 房屋竣工面积 * 商品房销售单价
    # 房屋竣工面积[年度数据,单位为万平方米]
    house_area_build_complete = cal_house_comp_area()
    # 3.2 2013年之后用 房屋竣工面积 * 商品房销售单价
    # 商品房竣工单价
    house_comp_price_per_unit_before_2013 = cal_house_comp_price_per_unit_before_2013(
        house_comp_value_before_2013, house_area_build_complete
    )
    # 建筑业竣工单价
    house_ark_price_per_unit = cal_ark_comp_price_per_unit()
    house_ark_price_per_unit_after_2012 = house_ark_price_per_unit[house_ark_price_per_unit.index >= '2013-12-31']
    
    se = pd.concat(
        [
            house_comp_price_per_unit_before_2013, 
            house_ark_price_per_unit_after_2012 * assumption['ratio_1'][1]
         ]
        )
    se.name = '商品房竣工单价(单位元每平米)'
    return se


def cal_and_concat_house_comp_value():
    house_comp_price_per_unit = cal_house_comp_price_per_unit()
    # 3.1 2012年之前用 2013年之前的商品房竣工价值
    house_comp_value_before_2013 = cal_house_for_sale_complete_value_before_2013()
    # 3.2 2012年之后用 商品房竣工单价 * 房屋竣工面积

    # 房屋竣工面积[年度数据,单位为万平方米]
    house_area_build_complete = cal_house_comp_area()

    idx1 = house_comp_price_per_unit.index
    idx2 = house_area_build_complete.index
    share_idx = [s for s in idx1 if s in idx2]
    house_comp_price_per_unit = house_comp_price_per_unit[share_idx]
    house_area_build_complete = house_area_build_complete[share_idx]
    house_comp_value_all = house_comp_price_per_unit * house_area_build_complete
    house_comp_value_all.name = '商品房竣工价值(单位亿元)'
    house_comp_value_all = house_comp_value_all / 10000

    se = pd.concat(
        [
            house_comp_value_before_2013, 
            house_comp_value_all[house_comp_value_all.index > '2012-12-31']
            ]
        )
    se.name = '商品房竣工价值(单位亿元)'
    return se


def land_buy_money():
    """
    计算土地成交价款
    """
    df = pd.read_excel(r'.\投资数据源\土地成交价款.xlsx', index_col=1)
    # 数据特点，删除前8列元素
    df = df.iloc[:,8:].T
    # 选取12月的累计值数据当作年度值
    df.index = pd.to_datetime(df.index)
    se = df.iloc[:,0]
    se.name = '本年土地成交价款(单位亿元)'
    
    m_data = get_data(freq='M',use_cache=True, sub_dir=False)
    land_money_100_city = m_data['一百城成交土地总价']
    land_money_100_city.dropna(inplace=True)
    # 对每月数据按年分组求和，生成年度数据
    yearly_land_money = land_money_100_city.groupby(land_money_100_city.index.year).sum()
    yearly_land_money.name = '年度一百城成交土地总价'
    yearly_land_money.index = yearly_land_money.index.astype(str) + '-12-31'
    
    yearly_land_money.index = pd.to_datetime(yearly_land_money.index)
    # 如果不满12个月，不能取最新的yearly数据
    if land_money_100_city.index.month[-1] != 12:
        yearly_land_money = yearly_land_money.iloc[:-1]
    
    se.index = pd.to_datetime(se.index)
    
    df = pd.concat([yearly_land_money, se], axis=1)
    df['year'] = df.index.year
    df['pct_change'] = df['年度一百城成交土地总价'].pct_change()
    df['date'] = df.index
    df.index = list(range(len(df)))
    
    for i in range(len(df)):
        row_se = df.iloc[i, :]
        if row_se['date'].year > 2022:
            pct_change = row_se['pct_change']
            last_year_row = df.iloc[i-1, :]
            v_last_year = last_year_row['本年土地成交价款(单位亿元)']
            # 修改前：df['本年土地成交价款'][i] = v_last_year * (1 + pct_change)
            # 修改后：
            df.loc[i, '本年土地成交价款(单位亿元)'] = v_last_year * (1 + pct_change)
    df.index = df['date']
    final_se = df['本年土地成交价款(单位亿元)']
    return final_se
        

def cal_house_sale_value_added():
    """
    计算商品房销售增值
    """

    m_data = get_data(freq='M',use_cache=True, sub_dir=False)
    q_data = get_data(freq='Q',use_cache=True, sub_dir=False)
    data_ = m_data.loc[:, ['商品房销售额累计值', '商品房销售面积累计值']]
    data_ = cum_df_to_yearly_df(data_)

    # 步骤一、计算商品房销售单价
    # 10000 *  亿元 / 万平米 = 元 / 平米
    house_sales_price = 10000 * data_['商品房销售额累计值'] / data_['商品房销售面积累计值']
    house_sales_price.name = '商品房销售单价(元每平米)'
    # 步骤二、提取 房屋竣工面积
    # 房屋竣工面积[年度数据,单位为万平方米]
    house_area_build_complete = cal_house_comp_area()

    # 步骤三、计算商品房竣工价值
    house_comp_value = cal_and_concat_house_comp_value()

    # 步骤四、土地成交价款
    buy_land_cost_money = land_buy_money()

    df_pp = pd.concat(
        [
            house_sales_price,
            house_area_build_complete,
            house_comp_value,
            buy_land_cost_money
        ],
        axis=1
    )

    df_pp['商品房销售价值(单位亿元)'] = df_pp['商品房销售单价(元每平米)'] * df_pp['房屋竣工面积(单位万平米)'] / 10000
    df_pp['商品房销售增值(单位亿元)'] = df_pp['商品房销售价值(单位亿元)'] - \
        df_pp['商品房竣工价值(单位亿元)'] - df_pp['本年土地成交价款(单位亿元)']
    return df_pp


if __name__ == "__main__":
    df = cal_house_sale_value_added()
    print(df)